]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
workspacesView: Calculate the workspaces geometry ourselves
authorJasper St. Pierre <jstpierre@mecheye.net>
Mon, 25 Feb 2013 23:11:59 +0000 (18:11 -0500)
committerJasper St. Pierre <jstpierre@mecheye.net>
Mon, 22 Apr 2013 18:00:59 +0000 (14:00 -0400)
To ensure that we don't recalculate window layouts when zooming
in or out, we need to always pass the full geometry. This will
break window repositioning when we zoom back in; for the purposes
of commit clarity, this breaks this feature for now. It will be
added back soon.

https://bugzilla.gnome.org/show_bug.cgi?id=694469

js/ui/overviewControls.js
js/ui/viewSelector.js
js/ui/workspacesView.js

index ba1cf275de481e41ae6b2f4078e5c304e2c8699e..7563975df9f553253bb3b4b7404030cff27aba63 100644 (file)
@@ -520,6 +520,8 @@ const ControlsManager = new Lang.Class({
                                                    expand: true });
         this._group.add_actor(this._thumbnailsSlider.actor);
 
+        this._group.connect('notify::allocation', Lang.bind(this, this._updateWorkspacesGeometry));
+
         Main.overview.connect('showing', Lang.bind(this, this._updateSpacerVisibility));
         Main.overview.connect('item-drag-begin', Lang.bind(this,
             function() {
@@ -537,6 +539,26 @@ const ControlsManager = new Lang.Class({
             }));
     },
 
+    _updateWorkspacesGeometry: function() {
+        let [x, y] = this.actor.get_transformed_position();
+        let [width, height] = this.actor.get_transformed_size();
+        let geometry = { x: x, y: y, width: width, height: height };
+
+        let spacing = this.actor.get_theme_node().get_length('spacing');
+        let dashWidth = this._dashSlider.getVisibleWidth() + spacing;
+        let thumbnailsWidth = this._thumbnailsSlider.getNonExpandedWidth() + spacing;
+
+        geometry.width -= dashWidth;
+        geometry.width -= thumbnailsWidth;
+
+        if (this.actor.get_text_direction() == Clutter.TextDirection.LTR)
+            geometry.x += dashWidth;
+        else
+            geometry.x += thumbnailsWidth;
+
+        this.viewSelector.setWorkspacesGeometry(geometry);
+    },
+
     _setVisibility: function() {
         // Ignore the case when we're leaving the overview, since
         // actors will be made visible again when entering the overview
index 639acf30b65b9298fbe5312bf7073fd1f9dedca4..a7ad1b53b58dfdb94dd5817189487fcb312deb93 100644 (file)
@@ -186,6 +186,10 @@ const ViewSelector = new Lang.Class({
             Main.overview.fadeInDesktop();
     },
 
+    setWorkspacesGeometry: function(geom) {
+        this._workspacesDisplay.setWorkspacesGeometry(geom);
+    },
+
     hide: function() {
         this._workspacesDisplay.hide();
     },
index 9400d24abde519ec483dbef9f9aab1992fa2bac2..7cb3b7e58af7d454633ec7a7682676392a092f67 100644 (file)
@@ -429,7 +429,6 @@ const WorkspacesDisplay = new Lang.Class({
 
     _init: function() {
         this.actor = new St.Widget({ clip_to_allocation: true });
-        this.actor.connect('notify::allocation', Lang.bind(this, this._updateWorkspacesGeometry));
         this.actor.connect('parent-set', Lang.bind(this, this._parentSet));
 
         let clickAction = new Clutter.ClickAction()
@@ -631,20 +630,23 @@ const WorkspacesDisplay = new Lang.Class({
         }));
     },
 
+    // This geometry should always be the fullest geometry
+    // the workspaces switcher can ever be allocated, as if
+    // the sliding controls were never slid in at all.
+    setWorkspacesGeometry: function(geom) {
+        this._geometry = geom;
+        this._updateWorkspacesGeometry();
+    },
+
     _updateWorkspacesGeometry: function() {
         if (!this._workspacesViews.length)
             return;
 
-        let width = this.actor.allocation.x2 - this.actor.allocation.x1;
-        let height = this.actor.allocation.y2 - this.actor.allocation.y1;
-
-        let [x, y] = this.actor.get_transformed_position();
-
         let monitors = Main.layoutManager.monitors;
         let m = 0;
         for (let i = 0; i < monitors.length; i++) {
             if (i == this._primaryIndex) {
-                this._workspacesViews[m].setGeometry({ x: x, y: y, width: width, height: height });
+                this._workspacesViews[m].setGeometry(this._geometry);
                 m++;
             } else if (!this._workspacesOnlyOnPrimary) {
                 this._workspacesViews[m].setGeometry(monitors[i]);